package strategy;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

public class RunJava {

    public static void main(String[] args) {

        System.out.println("设计模式之策略模式实现");

        //以排序方案来展示策略模式应用场景

        int[] ints = {1, 12, 3, 5};

        //使用排序类来处理数组的排序

        System.out.println("排序问题展示");
        SortClass sortClass = new SortClass();
        int[] resultArr = sortClass.sort(ints);
        System.out.println(Arrays.toString(resultArr));
        System.out.println("只能排序int数组, 且排序规则在排序类中写死");

        System.out.println("=====================");
        /*
        以上方案有两个问题:
            1: 需要排序的数组类型固定, 如果排序其他类型数组需要重载排序类.
            2: 排序规则固定, 如要变更喝新增就需要对排序类进行修改.
        对源码进行反复改动违背了设计模式的开闭原则, 即对修改关闭, 对拓展开放.
        设计模式中的策略模式可以解决以上的问题.
         */

        String[] strings = {"qweqeq", "中文", "123456", "     __", "QEQ"};

        SortStrategyClass<String> sortStrategyClass = new SortStrategyClass<>();

        System.out.println("使用字符串排序策略对字符串数组排序");
        String[] resultStringarr = sortStrategyClass.sort(strings, new StringSortStrategy());
        System.out.println("排序结果=> " + Arrays.toString(resultStringarr));
        System.out.println("=====================");

        Home[] homes = {
                new Home(100.01, new BigDecimal("226.972")),
                new Home(90.23, new BigDecimal("230.97")),
                new Home(190.99, new BigDecimal("544.0001")),
                new Home(240.00, new BigDecimal("560")),
                new Home(70.98, new BigDecimal("80")),
        };
        System.out.println("使用房间面积排序策略对房间数组进行排序");

        SortStrategyClass<Home> homeSortStrategyClass = new SortStrategyClass<>();
        Home[] homeAreaSortResultArr = homeSortStrategyClass.sort(homes, new HomeAreaSortStrategy());
        System.out.println("排序结果=> " + Arrays.toString(homeAreaSortResultArr));
        System.out.println("=====================");
        System.out.println("使用房价价格排序策略对房间数组进行排序");
        Home[] homePriceSortResultArr = homeSortStrategyClass.sort(homes, new HomePriceSortStrategy());
        System.out.println("排序结果=> " + Arrays.toString(homePriceSortResultArr));

    }
}
